from . import index_blu  # 导入index下面的蓝图
from flask import current_app
from info import redis_store
from flask import render_template
from flask import session
from info.models import User, News, Category
from info import constants
from flask import request
from flask import jsonify
from info.utils.response_code import RET


# 针对新闻分类进行处理
@index_blu.route('/news')
def get_new_list():
    """
      获取`分类新闻`列表信息:
    1. 接收参数并进行参数验证
    2. 根据`分类id`获取新闻的信息并进行分页
    3. 返回数据
    """
    # 针对index.js进行操作,发起请求后
    # var
    # params = {
    #     "cid": currentCid,
    #     "page": cur_page,
    #     "per_page": 10
    # };

    # 接收参数进行参数验证
    # 新闻id
    category_id = request.args.get('cid')
    # 第几页
    page = request.args.get('page', 1)  # 如果获取不到page,默认取1

    # 设置每页展示新闻的数量,获取不到,则默认取constants.HOME_PAGE_MAX_NEWS
    per_age = request.args.get('per_page', constants.HOME_PAGE_MAX_NEWS)

    if not category_id:
        return jsonify(errno=RET.PARAMERR, errmsg='缺少参数')
    try:
        # 这些参数一定会是数字,所以可以进行转换,不然就是错误的
        category_id = int(category_id)
        page = int(page)
        per_age = int(per_age)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 根据新闻的id进行分页
    # 一个可能经常会遇见的问题,因为最新的那个是没有外键的,而且是以所有的新闻进行点击排序
    # 所以在这里加一个条件,当id等于1时,就是最新的,因此点击最新时,他是不能进入判断条件的
    # 利用*filters进行拆分,点击最新时,filters是一个空列表,会取到所有,进行排序
    filters = []
    if category_id != 1:
        filters.append(News.category_id == category_id)
        print(category_id)  # 这个id每次都会不相同
        # 下面的两个filters打印结果是相同的,因为前端每次传过来,后端到数据库去取的
        # *filters对列表进行拆分
        print(filters)  # [<sqlalchemy.sql.elements.BinaryExpression object at 0x7f6c42cfc668>]
        print(*filters)  # info_news.category_id = :category_id_1
    try:
        # paginate里面的参数参照源代码进行查看
        pagination = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_age, False)

        news_li = pagination.items  # 获取所有
        total_page = pagination.pages  # 总页数
        current_page = pagination.page  # 当前页
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取分类数据失败')

    # 返回数据
    news_dict_li = []
    for news in news_li:
        #  news_li = pagination.items 是一个列表,进行遍历
        # 利用to_basic_dict()将每个数据转换为字典,可点击查看源代码
        news_dict_li.append(news.to_basic_dict())

    return jsonify(errno=RET.OK, errmsg='正确',
                   news_li=news_dict_li,
                   total_page=total_page,
                   current_app=current_page)


# # 创建蓝图路由
@index_blu.route('/', methods=['GET', 'POST'])  # 利用postman查看post请求进行查看是否开启csrf验证
def index():
    # # 下面是flask在项目中进行输出
    # current_app.logger.fatal('Fatal Message')
    # current_app.logger.error('Error Message')
    # current_app.logger.warning('Warning Message')
    # current_app.logger.info('Info Message')
    # current_app.logger.debug('Debug Message')

    # from info import redis_store  # 避免循环引用问题,这样就可以设置redis内容了
    # redis_store.set('name', 'what love about1')  # 在终端查看redis数据库是否连接好
    # return 'Welcome to the new world,what'

    # 获取session中是否有保存用户的session信息,在用户登录处保存的,做出相应的操作
    user_id = session.get('user_id')  # 从session惊醒获取passport有进行存储

    # ???????????????????????????????
    user = None
    # 判断是否有用户的session
    if user_id:
        try:
            # 从数据库表中获取用户在session保存的user_id,数据库也会有
            user = User.query.get(user_id)
            print(user_id, 444444444)
            print(user, 555555555)
            # QINIU_DOMIN_PREFIX = "http://oyucyko3w.bkt.clouddn.com/" 七牛云地址
            # 表示头像avatar_url,这里把头像存在七牛云上面
            user.avatar_url = constants.QINIU_DOMIN_PREFIX + user.avatar_url
        except Exception as e:
            current_app.logger.error(e)

    # 获取点击排行的新闻信息,对新闻右边框内容根据点击量进行由大到小排序,固定显示条数
    # 在表中已经保存了点击这个表,浏览器每点击一次,对应的点击量会进行增加
    rank_news_li = []
    try:
        rank_news_li = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS).all()
    except Exception as e:
        current_app.logger.error(e)

    # 获取到所有新闻,然后传给模板
    categories = []
    try:
        categories = Category.query.all()  # 获取到所有新闻
    except Exception as e:
        current_app.logger.error(e)
    return render_template('news/index.html',
                           user=user,
                           rank_news_li=rank_news_li,
                           categories=categories)


# 浏览器启动时会默认访问静态文件下的这个路径,小图标,有时候浏览器可能显示不出,可用单前浏览器查看百度图标,跟着进行设置
# 具体见index.html
@index_blu.route('/favicon.ico')
def send_web_ico():
    return current_app.send_static_file('news/favicon.ico')
